基于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)