日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

接入米家(通过米家购买的WIFI模组 串口方式)

發布時間:2024/3/26 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 接入米家(通过米家购买的WIFI模组 串口方式) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、文檔資料

添加鏈接描述

二、整體流程

  • 引腳
  • 命令列表(注意\r結尾)
  • 其中,restore 用于重新配置模組,類似于出廠了,出廠后,設備進入ap模式

    arch ble_config ble_event ble_fastpair ble_linkage call config_router country_code echo error event event_occured factory get_down getwifi help json_ack json_get_down json_send log mac mcu_version model net properties_changed props reboot restore result set_mcu_auto_ota setwifi store time update_me version
  • 上電先發送model
  • 周期性發送get_down
    屬性格式如下:uid pid 數據
    注意布爾類型,是 true 和 flse,字符串類型,需要加上 “”
  • 設置屬性:這里一共有2個屬性
    第一個是 1 1 ,數值是10
    第二個是 1 88 ,數值是 字符串數據

    對于下發的數據,必須回復 result
    格式:result uid pid 返回碼(0為成功)

    ↑ get_down ↓ down set_properties 1 1 10 1 88 "str_value" ↑ result 1 1 0 1 88 -4003

    獲取屬性:
    第一個是 1 2
    第二個是 1 3

    必須回復 result
    格式:result uid pid 返回碼(0為成功) 數值

    ↑ get_down ↓ down get_properties 1 2 1 3 ↑ result 1 2 0 10 1 3 0 "str_value"

    上報屬性:

    ↑properties_changed 1 1 10↓ok
  • 周期性通過 net 查詢當前網絡狀態,也可以通過 get_down返回的mii狀態判斷、
  • 三、整體測試代碼(含串口邏輯)

    /** ****************************************************************************** * @file main.c * @author AE team * @version V1.1.1 * @date 15/05/2019 * @brief ****************************************************************************** * @copy * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, MindMotion SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * * <h2><center>&copy; COPYRIGHT 2019 MindMotion</center></h2> */ #include "HAL_device.h" #include "HAL_conf.h" #include "stdio.h" #include "string.h"#define LED2_ON() GPIO_SetBits(GPIOA,GPIO_Pin_2) // PB4 #define LED2_OFF() GPIO_ResetBits(GPIOA,GPIO_Pin_2) // PB4 #define LED2_TOGGLE() (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2))?(GPIO_ResetBits(GPIOA,GPIO_Pin_2)):(GPIO_SetBits(GPIOA,GPIO_Pin_2)) // PB4#define LED1_ON() GPIO_SetBits(GPIOA,GPIO_Pin_1) // PB5 #define LED1_OFF() GPIO_ResetBits(GPIOA,GPIO_Pin_1) // PB5 #define LED1_TOGGLE() (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1))?(GPIO_ResetBits(GPIOA,GPIO_Pin_1)):(GPIO_SetBits(GPIOA,GPIO_Pin_1)) // PB5#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4) #define KEY2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)void LED_Init(void);void Tim1_UPCount_init(u16 Prescaler, u16 Period);extern u32 SystemCoreClock;unsigned int uiCnt = 0; u8 timeflag = 0; uint16_t time_cont; char printBuf[100];uint16_t uart_cont = 0; uint8_t uart_timeout_cont = 0;#define UART_BUFF_LEN 200 //定義最大接收字節數 200 uint8_t uart_buf[UART_BUFF_LEN];//單位1ms #define WIFI_MODEL_UPLOAD_TIME 100 //電后 100ms后上報 #define WIFI_INQUIRE_PEROID 100//數據查詢周期,要一直獲取 #define WIFI_DATA_UPLOAD_PEROID 1000//1秒上報一次數據 #define WIFI_CHECK_PEROID 1000//1秒檢測一次wifi狀態#define KEY_SHORT_PRESS_TIME 30 //短按30ms #define KEY_LONG_PRESS_TIME 2000 //長按兩秒#define MI_MODEL "model 這里填模塊名字" //對應項目模塊名字uint8_t net_conn_flag = 0;//是否聯網成功 uint16_t wifi_inquire_cont = 0,wifi_model_upload_cont = 1,wifi_check_cont = 0,wifi_data_upload_cont;uint16_t key1_cont; uint8_t key1_state = 0;/******************************************************************************************************** **函數信息 TIM1_BRK_UP_TRG_COM_IRQHandler(void) **功能描述 :等待定時器溢出,產生中斷 **輸入參數 :無 **輸出參數 :無 ********************************************************************************************************/ void TIM1_BRK_UP_TRG_COM_IRQHandler(void) {if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) {TIM_ClearITPendingBit(TIM1, TIM_IT_Update);time_cont ++ ;if(uart_timeout_cont)uart_timeout_cont++;//串口超時計數wifi_inquire_cont++;//wifi心跳wifi_check_cont ++; //檢測網絡狀態wifi_data_upload_cont++;//數據上報key1_cont ++ ;//按鍵if(wifi_model_upload_cont)wifi_model_upload_cont++;//上電后多久上報一次model 只使用一次} } void Tim1_Int_Enable(void) {NVIC_InitTypeDef NVIC_StructInit;//config Tim1 interruptNVIC_StructInit.NVIC_IRQChannel = TIM1_BRK_UP_TRG_COM_IRQn;NVIC_StructInit.NVIC_IRQChannelPriority = 1;NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_StructInit);TIM_ClearFlag(TIM1, TIM_FLAG_Update);TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); }/******************************************************************************************************** **函數信息 :void Tim1_UPCount_init(u16 Period,u16 Prescaler) **功能描述 :配置定時器1向上計數模式 **輸入參數 :Period 16位計數器重載值,Prescaler 時鐘預分頻值 **輸出參數 :無 ********************************************************************************************************/ void Tim1_UPCount_init(u16 Prescaler, u16 Period) {TIM_TimeBaseInitTypeDef TIM_StructInit;/*使能TIM1時鐘,默認時鐘源為PCLK2(PCLK2未分頻時不倍頻,否則由PCLK2倍頻輸出),可選其它時鐘源*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);TIM_TimeBaseStructInit(&TIM_StructInit);TIM_StructInit.TIM_Period = Period; //ARR寄存器值TIM_StructInit.TIM_Prescaler = Prescaler; //預分頻值/*數字濾波器采樣頻率,不影響定時器時鐘*/TIM_StructInit.TIM_ClockDivision = TIM_CKD_DIV1; //采樣分頻值TIM_StructInit.TIM_CounterMode = TIM_CounterMode_Up; //計數模式TIM_StructInit.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM1, &TIM_StructInit);TIM_ARRPreloadConfig(TIM1, ENABLE);Tim1_Int_Enable();TIM_Cmd(TIM1, ENABLE); }/******************************************************************************* * @name : GPIO_Clock_Set * @brief : RCC clock set * @param : Portx , State * @retval : void *******************************************************************************/ void GPIO_Clock_Set(GPIO_TypeDef* GPIOx, FunctionalState NewState) {if(GPIOx == GPIOA) {RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, NewState); //GPIO clock starts}if(GPIOx == GPIOB) {RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, NewState); //GPIO clock starts}if(GPIOx == GPIOC) {RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, NewState); //GPIO clock starts}if(GPIOx == GPIOD) {RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, NewState); //GPIO clock starts} } /******************************************************************************************************** **函數信息 :LED_Init(void) **功能描述 :LED初始化 **輸入參數 :無 **輸出參數 :無 ********************************************************************************************************/ void LED_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;GPIO_Clock_Set(GPIOA, ENABLE); //開啟GPIOA時鐘// GPIO_Clock_Set(GPIOB, ENABLE); //開啟GPIOB時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);LED1_ON();LED2_OFF(); }void KEY_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;GPIO_Clock_Set(GPIOA, ENABLE); //開啟GPIOA時鐘// GPIO_Clock_Set(GPIOB, ENABLE); //開啟GPIOB時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉GPIO_Init(GPIOA, &GPIO_InitStructure); }/******************************************************************************************************** **函數信息 :void uart_nvic_init(u32 bound) **功能描述 :UART端口、中斷初始化 **輸入參數 :bound **輸出參數 : ** 備注 : ********************************************************************************************************/ void uart_nvic_init(u32 bound) {//GPIO端口設置GPIO_InitTypeDef GPIO_InitStructure;UART_InitTypeDef UART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE); //使能UART1RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //開啟GPIOA時鐘//UART1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPriority = 3; //子優先級3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器//UART 初始化設置GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);UART_InitStructure.UART_BaudRate = bound; //串口波特率UART_InitStructure.UART_WordLength = UART_WordLength_8b; //字長為8位數據格式UART_InitStructure.UART_StopBits = UART_StopBits_1; //一個停止位UART_InitStructure.UART_Parity = UART_Parity_No; //無奇偶校驗位UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;//無硬件數據流控制UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx; //收發模式UART_Init(UART1, &UART_InitStructure); //初始化串口1UART_ITConfig(UART1, UART_IT_RXIEN, ENABLE); //開啟串口接受中斷UART_Cmd(UART1, ENABLE); //使能串口1//UART1_TX GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.9//UART1_RX GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.10}/******************************************************************************************************** **函數信息 :void UART1_IRQHandler(void) **功能描述 :串口1中斷服務程序 **輸入參數 : **輸出參數 : ** 備注 : ********************************************************************************************************/ void UART1_IRQHandler(void) {u8 Res;if(UART_GetITStatus(UART1, UART_IT_RXIEN) != RESET) { //接收中斷(接收到的數據必須是0x0d 0x0a結尾)UART_ClearITPendingBit(UART1, UART_IT_RXIEN);Res = UART_ReceiveData(UART1); //讀取接收到的數據if(uart_cont < UART_BUFF_LEN)uart_buf[uart_cont++] = Res;uart_timeout_cont = 1;} }/******************************************************************************************************** **函數信息 :void UartSendByte(u8 dat) **功能描述 :UART發送數據 **輸入參數 :dat **輸出參數 : ** 備注 : ********************************************************************************************************/ void UartSendByte(u8 dat) {UART_SendData(UART1, dat);while(!UART_GetFlagStatus(UART1, UART_FLAG_TXEPT)); }/******************************************************************************************************** **函數信息 :void UartSendGroup(u8* buf,u16 len) **功能描述 :UART發送數據 **輸入參數 :buf,len **輸出參數 : ** 備注 : ********************************************************************************************************/ void UartSendGroup(u8* buf, u16 len) {while(len--)UartSendByte(*buf++); }/* 上報model ,每次上電先傳過去 */ void mi_model_upload() {uint8_t data[50];sprintf((char *)data,"model %s\n",MI_MODEL);UartSendGroup(data,strlen((char *)data)); }/* 數據上報 輸入為2個ID和數據,注意ID和C都實用ascii碼數字 例如 '1' '2',注意總長度別超過256,這里暫時沒限制 */ void mi_data_upload(uint8_t eid,uint8_t pid , uint8_t *value) {uint8_t data[256];sprintf((char *)data,"properties_changed %c %c %s\r",eid,pid,value);UartSendGroup(data,strlen((char *)data)); }/* 周期性獲取數據,類似于心跳必須發 建議 100ms */ void mi_inquire() {UartSendGroup((uint8_t *)"get_down\r",strlen((char *)"get_down\r")); }/* 每1秒查詢一次網絡狀態具體可以自己來*/ void mi_net() {UartSendGroup((uint8_t *)"net\r",strlen((char *)"nte\r")); }/* 重置WIFI */ void mi_restore() {UartSendGroup((uint8_t *)"restore\r",strlen((char *)"restore\r")); } /* 解析串口數據 */ void mi_data_prase(uint8_t *data) {if(strstr((char *)data,"get_properties"))//平臺獲取數據 注意這個函數只支持 1-9 的eid和 1-9的pid 因為只是簡單實用位置去操作{//down get_properties 1 2//p+20 = eid//p+22 = piduint8_t eid,pid;//piduint8_t res_data[50],res_value[30];//回復的串口數據memset(res_data,0,sizeof(res_data));//回復的屬性數據memset(res_value,0,sizeof(res_value));memcpy(res_value,"1",1);//隨便先填一個數據上去eid = data[20];pid = data[22];//針對不同的pid 需要發送特定的數據回去 如果是bool類型需要傳 true等等switch(eid)//先判斷eid{case '2':{if(pid == '1'){//針對不同的pid 需要發送特定的數據回去 如果是bool類型需要傳 true等等strcpy((char *)res_value,"1");}else if(pid == '6')//2 - 6 {strcpy((char *)res_value,"55");}}break;case '5':{if(pid == '5'){//針對不同的pid 需要發送特定的數據回去 如果是bool類型需要傳 true等等strcpy((char *)res_value,"1300");}}break;default:{}break;}sprintf((char *)res_data,"result %s 0 %s\r",data+20,res_value);UartSendGroup(res_data,strlen((char *)res_data));//回復OK//result 5 3 0 }else if(strstr((char *)data,"set_properties"))//平臺設置數據{uint8_t eid,pid;uint8_t res_data[50];//回復的數據char *p;eid = data[20];pid = data[22];switch(eid)//先判斷eid{case '2':{if(pid == '1'){//數據位于 data[24] 一直到結尾}else if(pid == '2'){}}break;default:{}break;}p = strchr(data+22,' ');//找到第二個iid后面的空格*p = 0;//空格給 0sprintf((char *)res_data,"result %s 0\r",data+20);UartSendGroup(res_data,strlen((char *)res_data));//回復OK}//offline-連接中(或掉線);//local-連上路由器但未連上小米云服務器;//updating-固件升級中、uap模式等待連接、unprov-關閉wifi(半小時未快連)。else if( 0 == strcmp((char *)data,"offline"))//離線狀態{net_conn_flag = 0;}else if(0 == strcmp((char *)data,"uap"))//配網狀態{net_conn_flag = 1;}else if(0 == strcmp((char *)data,"local"))//連接wifi成功,正在連平臺{net_conn_flag = 2;}else if(0 == strcmp((char *)data,"cloud"))//檢測WIFI狀態{net_conn_flag = 3;} }/******************************************************************************************************** **函數信息 :main(void) **功能描述 : **輸入參數 :無 **輸出參數 :無 ********************************************************************************************************/ int main(void) {uint8_t upload_data[50];LED_Init();uart_nvic_init(115200);//串口115200 帶中斷 Tim1_UPCount_init(SystemCoreClock / 10000 - 1, 10);//1mswhile(1) {/* LED處理 判斷網絡狀態 */switch(net_conn_flag){case 0:{LED2_OFF();}break;case 1:{if(time_cont >= 1000) {LED2_TOGGLE();time_cont = 0;}}break;case 2:{if(time_cont >= 200) {LED2_TOGGLE();time_cont = 0;}}break;case 3:{LED2_ON(); }break;default:{}break;}/* 按鍵處理 */switch(key1_state){case 0:{if(!KEY1){if(key1_cont >= KEY_LONG_PRESS_TIME){mi_restore();key1_cont = 0;key1_state = 1;}}else {key1_cont = 0;}}break;case 1://等待松手{if(KEY1) key1_state = 0;}break;default:break;}/* 串口處理 */if(uart_timeout_cont >= 3)//串口數據30ms超時{uart_buf[uart_cont-1] = 0;//直接將 \r先干掉// uart_buf[uart_cont] = 0;mi_data_prase(uart_buf);///>處理收到的wifi數據uart_cont = 0;uart_timeout_cont = 0;}/*wifi處理*/if(wifi_model_upload_cont > WIFI_MODEL_UPLOAD_TIME)//上報一次的model,上電后只執行一次{mi_model_upload();wifi_model_upload_cont = 0;}if(wifi_inquire_cont >= WIFI_INQUIRE_PEROID)//數據處理周期 {mi_inquire();wifi_inquire_cont = 0;}if(wifi_check_cont >= WIFI_CHECK_PEROID)//檢測WIFI狀態{wifi_check_cont = 0;mi_net();}if(wifi_data_upload_cont >= WIFI_DATA_UPLOAD_PEROID){wifi_data_upload_cont = 0;/* 數據上傳測試uiCnt++;memset(upload_data,0,sizeof(upload_data));sprintf(upload_data,"%d",uiCnt);mi_data_upload('5','7',upload_data);*/}} } int fputc(int ch, FILE* stream) {//USART_SendData(USART1, (unsigned char) ch);//while (!(USART1->SR & USART_FLAG_TXE));UART_SendData(UART1, ch);while(!UART_GetFlagStatus(UART1, UART_FLAG_TXEPT));return ch; }/** * @} *//** * @} *//** * @} *//*-------------------------(C) COPYRIGHT 2019 MindMotion ----------------------*/

    總結

    以上是生活随笔為你收集整理的接入米家(通过米家购买的WIFI模组 串口方式)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。