基于OpenHarmony的智能门锁目前兼容的OH版本为3.0release~5.0Release。现已兼容我们自己在开源仓库最新的OH发行版源码。其他关于智能门锁的源码不多赘述,参考智能储物柜。
密码功能
static int DealSetPassword(const char *jsonString) { int ret = -1; cJSON *root = cJSON_Parse(jsonString); if (root == NULL) { const char *error_ptr = cJSON_GetErrorPtr(); if (error_ptr != NULL) { HILOG_ERROR(LOG_LABEL, "Parse json error: %s", error_ptr); } return ret; } CommandParamSetPsk setLockPskParam = {0}; cJSON *paras = cJSON_GetObjectItem(root, "paras"); if (paras == NULL) { HILOG_ERROR(LOG_LABEL, "Paras not exist"); cJSON_Delete(root); return ret; } cJSON *pskId = cJSON_GetObjectItem(paras, "PskId"); if (pskId != NULL && cJSON_IsString(pskId)) { const char *id = cJSON_GetStringValue(pskId); if (id == NULL || strlen(id) > LOCK_ID_LENGTH) { HILOG_ERROR(LOG_LABEL, "check lock id failed!"); cJSON_Delete(root); return -1; } strncpy(setLockPskParam.id, id, strlen(id)); } else { cJSON_Delete(root); return ret; } cJSON *option = cJSON_GetObjectItem(paras, "Option"); if (option != NULL && cJSON_IsString(option)) { const char *opt = cJSON_GetStringValue(option); setLockPskParam.option = GetOptionType(opt); if (setLockPskParam.option == OPTION_NONE) { HILOG_ERROR(LOG_LABEL, "no such option(%s)!", opt); cJSON_Delete(root); return -1; } HILOG_INFO(LOG_LABEL, "option = %s", opt); } else { cJSON_Delete(root); return ret; } cJSON *lockPsk = cJSON_GetObjectItem(paras, "LockPsk"); if (lockPsk != NULL && cJSON_IsString(lockPsk)) { const char *psk = cJSON_GetStringValue(lockPsk); if (psk == NULL || strlen(psk) > LOCK_PSK_LENGTH) { HILOG_ERROR(LOG_LABEL, "check psk failed!"); cJSON_Delete(root); return -1; } strncpy(setLockPskParam.password, psk, strlen(psk)); } else { cJSON_Delete(root); return ret; } ret = IotProfile_CommandCallback(CLOUD_COMMAND_SETPSK, &setLockPskParam); cJSON_Delete(root); return ret; }
门是否关好
static int InitGpio(void) { int ret = GPIO_Init(DOOR_PIN, GPIO_DIRECTION_IN, GPIO_PULL_NONE); if (ret != 0) { HILOG_ERROR(LOG_LABEL, "GPIO_failed: %d", ret); return -1; } return 0; } static void CheckDoorStatus(void) { int ret = GPIO_Read(DOOR_PIN); if (ret < 0) { HILOG_ERROR(LOG_LABEL, "Failed_GPIO: %d", ret); return; } if (ret == GPIO_HIGH) { HILOG_ERROR(LOG_LABEL, "not_closed"); } else { HILOG_INFO(LOG_LABEL, "is_closed."); } } static void TimerCallback(void *arg) { CheckDoorStatus(); TimerStart((TimerHandle_t)arg, CHECK_INTERVAL); } static int DoorStatusAppMain(int argc, char *argv[]) { if (InitGpio() != 0) { return -1; } TimerHandle_t timer = TimerCreate(TIMER_MODE_PERIODIC, TimerCallback, NULL); if (timer == NULL) { HILOG_ERROR(LOG_LABEL, "Failed"); GPIO_Deinit(DOOR_PIN); return -1; } TimerStart(timer, CHECK_INTERVAL); while (1) { sleep(1); } TimerDelete(timer); GPIO_Deinit(DOOR_PIN); return 0; } APP_ENTRY(DoorStatusAppMain)