| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410 |
- #include "CONFIG.h"
- #if EC800M
- #include "stm32f10x.h"
- #include "Regist.h"
- #include "FlashSetup.h"
- #include <stdio.h>
- #include <stdarg.h>
- #include <string.h>
- #include <stdlib.h>
- #include "cJSON.h"
- #include "mbedtls_util.h"
- #include "Log_Module.h"
- #include "At_Module.h"
- #include "Common_Util.h"
- #include "Tuoreniot.h"
- #include "ec800m.h"
- // 泵号
- extern uint8_t mcu_id[8];
- // socket ID
- static uint8_t connectID = 2;
- // 注册参数
- static struct TUORENIOT_RegistRequestStruct regist_request = {
- .version = 1,
- .platform = "aliyun",
- .networkProtocol = "CoAP",
- .deviceId = "3431228A1936013C",
- .userId = 4562
- };
- /**
- *
- *注册参数信息打包
- */
- void TUORENIOT_PackRegistRequest(uint8_t * pack_data, uint16_t * pack_data_length, struct TUORENIOT_RegistRequestStruct * registParams)
- {
-
- Log_Printf_Debug("mcu_id: %s\r\n", mcu_id);
- // 设置deviceId
- bytesToHex(registParams->deviceId, mcu_id, sizeof(mcu_id));
-
- sprintf((char *)(pack_data + 2), "{\"platform\":\"%s\",\"connectionType\":\"%s\",\"deviceId\":\"%s\"}",
- registParams->platform, registParams->networkProtocol, registParams->deviceId); // 拼接AT指令
- Log_Printf_Debug("%s\r\n", (char *)(pack_data + 2));
-
- uint16_t datalen = utils_aes128_ECB_base64_enc_with_length(regist_key, (pack_data + 2));
-
- pack_data[0] = datalen>>8;//头2个字节赋值数据长度
- pack_data[1] = datalen;
- * pack_data_length = datalen + 2;
- }
- // 函数声明
- static void REGIST_Process(void); // 注册流程
- static void REGIST_SetStatus(enum REGIST_StatusEnum status); // 设置注册状态
- static void REGIST_SetResult(enum REGIST_ResultEnum result); // 设置注册结果
- static void goto_start(void); // 开始
- static void goto_success(void); // 成功
- static void goto_failure(char * _info); // 失败
- static void goto_finish(void); // 结束
- // 流程
- enum Step{
- STEP_START, // 开始
- STEP_EXIT_SLEEP, // 退出睡眠
- STEP_ENTER_SLEEP, // 进入睡眠
- STEP_WAIT, // 等待
-
- STEP_STATE, // 查询状态
- STEP_OPEN, // 打开
- STEP_OPEN_WAIT_RESULT, // 等待打开结果
- STEP_JUDGE_AUTH_OR_DATA, // 判断认证还是发送
- STEP_JOIN_AUTH_MESSAGE, // 拼接认证报文
- STEP_JOIN_DATA_MESSAGE, // 拼接数据报文
- STEP_QUERY_SLEEP, // 查询休眠
- STEP_SET_SLEEP, // 开启休眠
- STEP_QUERY_QENG_SERVINGCELL, // 查询信号质量
-
- STEP_SET_QISDE_0, // 关闭发送回显
- STEP_SEND, // 发送
- STEP_RECV, // 等待发送结果
-
- STEP_SET_CFUN_0, // 设置最小功能模式
- STEP_WAIT_SET_CFUN_0, // 等待设置最小功能模式
- STEP_SET_CFUN_1, // 设置全功能模式
- STEP_WAIT_SET_CFUN_1, // 等待设置全功能模式结果
-
- STEP_SET_CGREG_2, // 设置ps域允许上报网络注册和位置信息
- STEP_QUERY_CGREG, // 查询网络注册状态
-
- STEP_CLOSE, // 关闭
-
- STEP_SUCCESS, // 成功
- STEP_FAILURE, // 失败
- STEP_FINISH, // 流程结束
-
-
- STEP_VERIFY_REGIST, // 验证注册
- STEP_VERIFY_INITIALIZE, // 验证初始化
- };
- // 步骤跳转时的监听
- static uint8_t STEP_QUERY_CGREG_times = 0; // 查询网络状态的次数
- static void initialize()
- {
- STEP_QUERY_CGREG_times = 0;
- }
- static uint16_t goto_step_event(uint16_t ns)
- {
- // 重置ec800m状态
- ec800m.reset();
-
- // 流程控制
- uint16_t step = ns;
- if(ns == STEP_QUERY_CGREG && STEP_QUERY_CGREG_times++ >= 20)
- {
- goto_failure("查询网络状态的次数过多,联网失败");
- step = STEP_FAILURE;
- }
- return step;
- }
- // 流程控制
- static struct PCTRL_Struct pctrl = {
- .current_step = STEP_FINISH,
- .next_step = STEP_FINISH,
- .step_wait = STEP_WAIT,
- .goto_step_listener = goto_step_event,
- };
- // 备注
- static char info[40];
- // 开始
- static void goto_start(void)
- {
- initialize();
- PCTRL_GotoStep(&pctrl, STEP_START, "开始");
- }
- // 成功
- static void goto_success(void)
- {
- REGIST_SetResult(REGIST_Result_Success);
- PCTRL_GotoStep(&pctrl, STEP_SUCCESS, "成功");
- }
- // 失败
- static void goto_failure(char * _info)
- {
- REGIST_SetResult(REGIST_Result_Failure);
- memset(info, 0, sizeof(info));
- strcpy(info, _info);
- PCTRL_GotoStep(&pctrl, STEP_FAILURE, "失败");
- Log_Printf_Debug("info:%s!\r\n", info);
- }
- // 结束
- static void goto_finish(void)
- {
- REGIST_SetStatus(REGIST_Status_Done);
- PCTRL_GotoStep(&pctrl, STEP_FINISH, "结束");
- }
- // 注册状态
- static enum REGIST_StatusEnum regist_status = REGIST_Status_None;
- // 注册结果
- static enum REGIST_ResultEnum regist_result = REGIST_Result_None;
- // 设置注册状态
- static void REGIST_SetStatus(enum REGIST_StatusEnum status)
- {
- regist_status = status;
- }
- // 获取注册状态
- enum REGIST_StatusEnum REGIST_GetStatus(void)
- {
- return regist_status;
- }
- // 设置注册结果
- static void REGIST_SetResult(enum REGIST_ResultEnum result)
- {
- regist_result = result;
- }
- // 获取注册结果
- enum REGIST_ResultEnum REGIST_GetResult(void)
- {
- return regist_result;
- }
- // 重置注册
- enum EXECUTE_ResultEnum REGIST_Reset(void)
- {
- if(REGIST_GetStatus() == REGIST_Status_Being)
- {
- Log_Printf_Debug("注册流程重置错误!\r\n");
- return EXECUTE_Result_Failure;
- }
- REGIST_SetStatus(REGIST_Status_None);
- REGIST_SetResult(REGIST_Result_None);
- return EXECUTE_Result_Success;
- }
- // 开始注册
- enum EXECUTE_ResultEnum REGIST_Start(void)
- {
- REGIST_Reset();
- if(REGIST_GetStatus() != REGIST_Status_None)
- {
- Log_Printf_Debug("注册流程启动错误!\r\n");
- return EXECUTE_Result_Failure;
- }
- goto_start();
- REGIST_SetStatus(REGIST_Status_Being);
- return EXECUTE_Result_Success;
- }
- // 注册流程处理,放到大循环里
- void REGIST_ProcessHandle(void)
- {
- if(REGIST_GetStatus() == REGIST_Status_Being)
- {
- REGIST_Process();
- }
- }
- // 发送数据的逻辑
- static enum Result result = Result_None;
- static uint8_t cgreg_n;
- static uint8_t cgreg_stat;
- static uint16_t cgreg_lac;
- static uint32_t cgreg_ci;
- static uint16_t socket_err = 0;
- static void REGIST_Process(void)
- {
- // 流程
- switch(pctrl.current_step)
- {
- case STEP_START: // 开始
- PCTRL_GotoStep(&pctrl, STEP_EXIT_SLEEP, "退出休眠");
- break;
- case STEP_EXIT_SLEEP: // 退出休眠
- ec800m.exit_sleep();
- PCTRL_GotoStepWait(&pctrl, STEP_SET_SLEEP, 3, "设置休眠模式");
- break;
- case STEP_SET_SLEEP: // 设置休眠模式
- result = ec800m.set_sleep(1);
- if(result != Result_None)
- {
- PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_1, "设置全功能模式");
- }
- else if(result == Result_Failed)
- {
- goto_failure("设置休眠模式失败");
- }
- break;
- case STEP_SET_CFUN_1: // 设置全功能模式
- result = ec800m.set_cfun(1);
- if(result == Result_Success)
- {
- PCTRL_GotoStep(&pctrl, STEP_SET_CGREG_2, "设置ps域");
- }
- else if(result == Result_Failed)
- {
- goto_failure("设置全功能模式失败");
- }
- break;
- case STEP_SET_CGREG_2: // 设置ps域
- result = ec800m.set_cgreg(2);
- if(result == Result_Success)
- {
- PCTRL_GotoStep(&pctrl, STEP_QUERY_CGREG, "查询ps域");
- }
- else if(result == Result_Failed)
- {
- goto_failure("设置ps域失败");
- }
- break;
- case STEP_QUERY_CGREG: // 查询ps域
- result = ec800m.query_cgreg(&cgreg_n, &cgreg_stat, &cgreg_lac, &cgreg_ci);
- if(result == Result_Success)
- {
- if(cgreg_stat == 1)
- {
- PCTRL_GotoStep(&pctrl, STEP_CLOSE, "断开tcp连接");
- }
- else
- {
- PCTRL_GotoWait(&pctrl, 500);
- }
- }
- else if(result == Result_Failed)
- {
- goto_failure("查询ps域失败");
- }
- break;
- case STEP_CLOSE: // 关闭连接
- result = ec800m.close_socket(connectID);
- if(result == Result_Success)
- {
- if(REGIST_GetResult() != REGIST_Result_None)
- {
- PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_0, "设置最小功能模式");
- }
- else
- {
- PCTRL_GotoStep(&pctrl, STEP_SET_QISDE_0, "关闭发送回显");
- }
- }
- else if(result == Result_Failed)
- {
- goto_failure("断开tcp连接失败");
- }
- break;
- case STEP_SET_QISDE_0: // 关闭发送回显
- result = ec800m.set_qisde(0);
- if(result == Result_Success)
- {
- PCTRL_GotoStep(&pctrl, STEP_OPEN, "连接tcp");
- }
- else if(result == Result_Failed)
- {
- goto_failure("关闭发送回显失败");
- }
- break;
- case STEP_OPEN: // 打开客户端
- result=ec800m.open_socket(connectID, "TCP", REGIST_SERVER, REGIST_PORT, 1, &socket_err);
- if(result == Result_Success)
- {
- PCTRL_GotoStep(&pctrl, STEP_SEND, "发送数据");
- // 打包注册请求
- memset(regist_data, 0, sizeof(regist_data));
- TUORENIOT_PackRegistRequest(regist_data, ®ist_data_length, ®ist_request);
- Log_Printf_Debug("regist_data: \r\n");
- Log_SendHex(regist_data, regist_data_length);
- Log_Printf_Debug("\r\n");
- TUORENIOT_PrintfRegistRequestStruct(®ist_request);
- }
- else if(result == Result_Failed)
- {
- goto_failure("连接tcp失败");
- }
- break;
- case STEP_SEND: // 发送send
- result = ec800m.send(connectID, regist_data, regist_data_length);
- if(result == Result_Success)
- {
- PCTRL_GotoStep(&pctrl, STEP_RECV, "等待结果");
- memset(regist_data, 0, sizeof(regist_data));
- }
- else if(result == Result_Failed)
- {
- goto_failure("发送数据失败");
- }
- break;
- case STEP_RECV: // 等待结果
- result = ec800m.recv_with_time(connectID, regist_data, ®ist_data_length, 10000);
- if(result == Result_Success)
- {
- uint8_t res = TUORENIOT_AnalysisRegistData(regist_data, regist_data_length);
- if(res == 1) // 成功
- {
- goto_success();
- }
- else // 失败
- {
- goto_failure("解析失败");
- }
- PCTRL_GotoStep(&pctrl, STEP_CLOSE, "断开tcp连接");
- }
- else if(result == Result_Failed)
- {
- goto_failure("等待结果失败");
- }
- break;
- case STEP_SET_CFUN_0: // 设置最小功能模式
- result = ec800m.set_cfun(0);
- if(result != Result_None)
- {
- PCTRL_GotoStep(&pctrl, STEP_ENTER_SLEEP, "进入睡眠");
- }
- break;
- case STEP_ENTER_SLEEP: // 进入睡眠
- ec800m.enter_sleep();
- goto_finish();
- break;
- case STEP_WAIT: // 等待
- PCTRL_Wait(&pctrl);
- break;
- case STEP_SUCCESS: // 成功
- PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_0, "设置最小功能模式");
- break;
- case STEP_FAILURE: // 失败
- PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_0, "设置最小功能模式");
- break;
- case STEP_FINISH: // 结束流程
- break;
- default:
- goto_failure("步骤不存在");
- break;
- }
-
- }
- #endif
|