授人以魚不如授人以漁,目的不是爲了教會你具體項目開發,而是學會學習的能力。但願你們分享給你周邊須要的朋友或者同窗,說不定大神成長之路有博哥的奠定石。。。web
QQ技術互動交流羣:ESP8266&32 物聯網開發 羣號622368884,不喜勿噴數據庫
1、基礎篇服務器
2、網絡篇網絡
- ESP8266開發之旅 網絡篇① 認識一下Arduino Core For ESP8266
- ESP8266開發之旅 網絡篇② ESP8266 工做模式與ESP8266WiFi庫
- ESP8266開發之旅 網絡篇③ Soft-AP——ESP8266WiFiAP庫的使用
- ESP8266開發之旅 網絡篇④ Station——ESP8266WiFiSTA庫的使用
- ESP8266開發之旅 網絡篇⑤ Scan WiFi——ESP8266WiFiScan庫的使用
- ESP8266開發之旅 網絡篇⑥ ESP8266WiFiGeneric——基礎庫
- ESP8266開發之旅 網絡篇⑦ TCP Server & TCP Client
- ESP8266開發之旅 網絡篇⑧ SmartConfig——一鍵配網
- ESP8266開發之旅 網絡篇⑨ HttpClient——ESP8266HTTPClient庫的使用
- ESP8266開發之旅 網絡篇⑩ UDP服務
- ESP8266開發之旅 網絡篇⑪ WebServer——ESP8266WebServer庫的使用
- ESP8266開發之旅 網絡篇⑫ 域名服務——ESP8266mDNS庫
- ESP8266開發之旅 網絡篇⑬ SPIFFS——ESP8266 Flash文件系統
- ESP8266開發之旅 網絡篇⑭ web配網
- ESP8266開發之旅 網絡篇⑮ 真正的域名服務——DNSServer
- ESP8266開發之旅 網絡篇⑯ 無線更新——OTA固件更新
3、應用篇架構
4、高級篇app
在上一篇博文 玩轉OneNET物聯網平臺之MQTT服務④ —— 遠程控制LED(設備自注冊)+ Android App控制 中,博主提供了OneNet智能燈的Mqtt協議的配套App。那麼,爲了方便你們開發以及拓展,博主這裏簡述一下源碼設計。框架
接下來,咱們挑一個頁面來說解,方便你們瞭解MVP工做方式。ide
/** * mvp 主頁面協議 presenter層 */ public interface IMainContract { // model層 interface IMainModel extends IBaseModel { void loadData(Context context, ICallBack<List<OneNetDeviceModel>> callBack); void updateDeviceDetail(Context context,OneNetDeviceModel model, ICallBack<String> callBack); } //view層 interface IMainView extends IBaseView { void showLoading(String loadmsg); void dismissLoading(OnDismissCallbackListener callback); void refreshList(List<OneNetDeviceModel> list); } }
public class MainModel implements IMainContract.IMainModel { SimpleTask task; //獲取設備列表 @Override public void loadData(Context context, final ICallBack<List<OneNetDeviceModel>> callBack) { if(task != null && task.getStatus()== AsyncTask.Status.RUNNING){ task.cancel(true); } task = new SimpleTask() { GetOneNetDeviceListEntity entity; @Override protected void onPreExecute() { entity = new GetOneNetDeviceListEntity(); } @Override protected Object doInBackground(String... strings) { return entity.request(); } @Override protected void onPostExecute(Object o) { String result = (String) o; if("200".equals(result)){ if(entity.data != null && entity.data.devices.size()!=0) { List<OneNetDeviceModel> list = new ArrayList<>(); for(OneNetDeviceModel model:entity.data.devices){ if(!model.getId().equals(PreferenceUtil.getInstance().getDeviceId())){ list.add(model); } } callBack.onSuccess(list); } }else { callBack.onFaild(result); } } }; task.startTask(); } //更新設備信息 @Override public void updateDeviceDetail(Context context, final OneNetDeviceModel model, final ICallBack<String> callBack) { if(task != null && task.getStatus()== AsyncTask.Status.RUNNING){ task.cancel(true); } task = new SimpleTask() { UpdateOneNetDeviceDetailEntity entity; @Override protected void onPreExecute() { entity = new UpdateOneNetDeviceDetailEntity(model.getId()); } @Override protected Object doInBackground(String... strings) { return entity.request(model); } @Override protected void onPostExecute(Object o) { String result = (String) o; if("200".equals(result)){ callBack.onSuccess("更新成功"); }else { callBack.onFaild(result); } } }; task.startTask(); } }
/** * @author wty * @Description 控制頁面 **/ public class MainActivity extends BaseActivity<MainPresenter> implements IMainContract.IMainView { @Bind(R.id.listview) XRecyclerView listview; DeviceListAdapter adapter; public static void startActivity(Activity activity) { Intent intent = new Intent(activity, MainActivity.class); activity.startActivity(intent); } @Override public MainPresenter getPresenter() { return new MainPresenter(); } @Override public void onInitView(Bundle savedInstanceState) { /** * 第一個參數是服務器地址 * 第二個參數是用戶名 * 第三個參數是密碼 * 第四個參數是客戶端ID * 第五個參數是主題 **/ MqttManager .getInstance() .creatConnect( AppConstant.RequestUrl.ONENET_MQTT, PreferenceUtil.getInstance().getProductId(), PreferenceUtil.getInstance().getApiKey(), PreferenceUtil.getInstance().getDeviceId(), "esp8266"); getDefaultNavigation().setTitle("OneNet智能燈"); getDefaultNavigation().getLeftButton().setButton("配置", new View.OnClickListener() { @Override public void onClick(View v) { OneNetMqttConfigActivity.startActivity(MainActivity.this); finish(); } }); getDefaultNavigation().getRightButton().setButton("關於應用", new View.OnClickListener() { @Override public void onClick(View v) { AboutActivity.startActivity(MainActivity.this); } }); LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); listview.setLayoutManager(layoutManager); listview.setPullRefreshEnabled(false); listview.setLoadingMoreEnabled(false); List<OneNetDeviceModel> data = new ArrayList<>(); adapter = new DeviceListAdapter(this,data,mPresenter); listview.setAdapter(adapter); mPresenter.refreshList(MainActivity.this); } @Override protected boolean isEnableStatusBar() { return true; } @Override protected List<String> validate() { List<String> list = super.validate(); return list; } @Override protected void onDestroy() { super.onDestroy(); MqttManager.release(); } @Override public int getLayoutResource() { return R.layout.activity_main; } @Override public void refreshList(List<OneNetDeviceModel> list) { adapter.retsetData(list); } }
/** * 主頁面 presenter */ public class MainPresenter extends BasePresenter<IMainContract.IMainView> { private IMainContract.IMainModel mMainModel; public MainPresenter(){ mMainModel = new MainModel(); } public void refreshList(Context context){ mView.showLoading("獲取設備列表中..."); mMainModel.loadData(context, new ICallBack<List<OneNetDeviceModel>>() { @Override public void onSuccess(final List<OneNetDeviceModel> list) { mView.refreshList(list); mView.dismissLoading(); } @Override public void onFaild(String msg) { mView.dismissLoading(new OnDismissCallbackListener(msg, SweetAlertDialog.ERROR_TYPE)); } }); } public void updateDeviceDetail(final Context context, OneNetDeviceModel model){ mView.showLoading("更新設備信息中..."); mMainModel.updateDeviceDetail(context,model, new ICallBack<String>() { @Override public void onSuccess(final String result) { mView.dismissLoading(); refreshList(context); } @Override public void onFaild(String msg) { mView.dismissLoading(new OnDismissCallbackListener(msg, SweetAlertDialog.ERROR_TYPE)); } }); } }
基本上,每一個頁面都是按照這個MVP的設計思路去分析就能夠了,很是簡單。工具
一句話,高手勿噴。源碼分析