RD腦講解著
當設計完ESP8266的MQTT後,由於需要告知ESP8266為Station mode時,要連接到家中哪個AP,所以我們用Socket丟到ESP8266 AP mode,當AP mode收到設定的帳號及密碼後,ESP8266將會轉為Station mode
當設計完ESP8266的MQTT後,由於需要告知ESP8266為Station mode時,要連接到家中哪個AP,所以我們用Socket丟到ESP8266 AP mode,當AP mode收到設定的帳號及密碼後,ESP8266將會轉為Station mode
你在繞口令嗎? PM腦說
ㄜ… 總之就是用Android丟Socket到ESP8266啦! RD腦說
Android需要丟一個字串,包括:
1、家裡的AP帳號
2、家裡的AP密碼
3、這個燈座的名字,例如放在房間就叫room,廁所就叫bathroom
4、GPS位置
所以Android呈現出來會如下圖
surf house - 是我家放衝浪板的地方,哦不!
是我家放AP的地方
…..
- 就是AP的密碼
room - 代表著我把這個燈座放在房間裡
點下Set Position就會出現GPS經緯度
點下 Set 代表要送Socket給ESP8266
主要程式碼如下:
public class APointSetting extends Activity implements
OnClickListener {
WifiManager mainWifiObj;
WifiScanReceiver
wifiReciever;
ListView list;
Spinner sp;
String wifis[];
Context mContext;
EditText editTextMessage,editTextMessage1;
GPSTracker gps;
private static final String TAG = "Client";
private Socket socket;
public SeekBar seekBar;
private static int SERVERPORT_MAIN = 0;
private static String SERVER_MAIN = "";
private String serverinputdata = null;
private String serveroutputdata = null;
public EditText et;
private Handler mHandler;
public static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.a_point_setting);
sp = (Spinner) findViewById(R.id.my_spinner1);
mainWifiObj = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifiReciever = new WifiScanReceiver();
mainWifiObj.startScan();
SERVERPORT_MAIN = 5000;
SERVER_MAIN = "192.168.4.1"; //esp8266
//SERVER_MAIN
= "192.168.1.1"; //ameba
new Thread(new
ClientThread()).start();
mHandler = new Handler();
final TextView
TextViewMessage = (TextView)findViewById(R.id.editText2);
final TextView
TextViewMessage1 = (TextView)findViewById(R.id.editText3);
editTextMessage = (EditText)findViewById(R.id.editText1);
editTextMessage1 = (EditText)findViewById(R.id.editText0);
TextView
skip,Setposition;
skip =
(TextView) findViewById(R.id.set);
Setposition
= (TextView) findViewById(R.id.setposition);
Setposition.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
// create class object
gps = new GPSTracker(APointSetting.this);
// check if GPS enabled
if(gps.canGetLocation()){
double latitude = gps.getLatitude();
double longitude = gps.getLongitude();
CharSequence
cs=String.valueOf(latitude);
CharSequence
cs1=String.valueOf(longitude);
TextViewMessage.setText(cs);
TextViewMessage1.setText(cs1);
}else{
gps.showSettingsAlert();
}
}
});
skip.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
try {
PrintWriter
out = new PrintWriter(new BufferedWriter(
new
OutputStreamWriter(socket.getOutputStream())),
true);
//以下就是整段程式的重點阿!!! 不用擔心地球 把Socket 丟 出 去 吧!
serveroutputdata = "\\"+(String) sp.getSelectedItem()+"\\"+editTextMessage.getText().toString()+"\\"+TextViewMessage.getText().toString()+"\\"+TextViewMessage1.getText().toString()+"\\"+editTextMessage1.getText().toString()+"\\"+"\r\n";
out.println(serveroutputdata);
//以上就是整段程式的重點阿!!! 不用擔心地球 把Socket 丟 出 去 吧!
}
catch (UnknownHostException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
TextView
tv = (TextView) v;
Toast.makeText(APointSetting.this, "Setting Success", Toast.LENGTH_SHORT).show();
finish();
//terminated this activity
}
});
}
class ClientThread implements Runnable {
@Override
public void run() {
BufferedReader
br;
try {
InetAddress
serverAddr = InetAddress.getByName(SERVER_MAIN);
socket = new Socket(serverAddr,
SERVERPORT_MAIN);
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
serverinputdata=br.readLine();
Log.i(TAG, "DATA:"+ serverinputdata);
}
} catch
(UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
@Override
public boolean
onOptionsItemSelected(MenuItem item) {
if (item.getItemId()
== android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
protected void onPause() {
unregisterReceiver(wifiReciever);
super.onPause();
}
protected void onResume() {
registerReceiver(wifiReciever, new IntentFilter(
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
super.onResume();
}
class WifiScanReceiver extends BroadcastReceiver
{
@SuppressLint("UseValueOf")
public void onReceive(Context c, Intent intent) {
List<ScanResult> wifiScanList = mainWifiObj.getScanResults();
wifis = new String[wifiScanList.size()];
for (int i = 0; i < wifiScanList.size(); i++) {
wifis[i] = ((wifiScanList.get(i).SSID));
}
ArrayAdapter<String> adapter = new
ArrayAdapter<String>(APointSetting.this, android.R.layout.simple_spinner_item, wifis);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp.setAdapter(adapter);
}
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
}
哦哦哦!太簡單啦! 可惡! 為什麼我不會寫程式!!! PM腦握著拳頭說
RD腦聳著肩說:不會上Coursera或台北E大線上學習,怪我囉?
( !這時候應該搭配HowFun來個業配免費線上學程式什麼的! )
本體:眼尖的讀者也許會發現被mark掉的這一行
//SERVER_MAIN = "192.168.1.1"; //ameba
沒錯,我們有試著使用Ameba,但發現一些尚未能解決的問題
就決定放著不理它,至於是什麼問題,就留待系列文章結束後再說明吧!
沒有留言:
張貼留言