tag 标签: esp32

相关帖子
相关博文
  • 2025-5-18 20:54
    230 次阅读|
    0 个评论
    7. ESP32开发之freeRTOS的互斥量
    什么是互斥量 互斥量的应用场合 互斥量的API函数 基本代码结构 互斥量使用举例 递归锁 递归锁举例 总结 什么是互斥量 在freeRTOS中,多个任务访问一块共享资源,会产生竞争现象。 比如马路上只有一个很早以前的电话亭,A、B都想要打电话,然后他们就开始打架了。但是如果A先进去了然后把门锁了,B想进去打电话的话只能在外面等,必须等到A把门锁打开。 互斥量的应用场合 像freeRTOS的多任务系统,任务A正在使用某个资源,还没用完的时候,任务B也来使用,就可能会导致问题。 就比如串口,任务A正在用串口发送数据,此时任务B也来用这个串口发送数据,这样就会导致数据混乱。 简而言之,多任务使用共享资源的情况下,就需要使用互斥量了。 这里有个特别强调的注意点 :按照正常的情况来说,只要任务A获取了互斥量,其他任务都无法释放互斥量才对。但是freeRTOS中并没有实现,其他任务也可释放互斥量。所以在freeRTOS中,大家默认谁获取互斥量,就该谁释放。 互斥量的API函数 创建互斥量 /* 返回值:正确返回SemaphoreHandle_t 变量,错误返回NULL */ SemaphoreHandle_t xSemaphoreCreateMutex( void ); 获取 /* 参数: xSemaphore : 创建的互斥量 xBlockTime : 获取锁等待时间,超时获取失败 返回值: 获取到,返回pdTRUE,反之,pdFALSE */ SemaphoreHandle_t xSemaphoreTake( xSemaphore, xBlockTime ) 释放 /* 参数: xSemaphore : 创建的互斥量 返回值: 释放成功,返回pdTRUE,反之,pdFALSE */ SemaphoreHandle_t xSemaphoreGive( xSemaphore, xBlockTime ) 基本代码结构 if(xSemaphoreTake(xSemaphore,pdMS_TO_TICKS(1000))==pdTRUE){ /*资源处理代码,这里可以称之为临界区*/ xSemaphoreGive(xSemaphore); } 互斥量使用举例 首先举一个错误例子,这样会有个对比 void taskA(void* pvPram) { while(1){ for(int i=0;i5;i++){ num++; ESP_LOGI("taskA","num is %d",num); } vTaskDelay(pdMS_TO_TICKS(1000)); } } void taskB(void* pvPram) { while(1){ num++; ESP_LOGI("taskB","num is %d",num); vTaskDelay(pdMS_TO_TICKS(1000)); } } void app_main(void) { xSemaphore=xSemaphoreCreateMutex(); xTaskCreatePinnedToCore(taskA,"taskA",2048,NULL,4,NULL,1); xTaskCreatePinnedToCore(taskB,"taskB",2048,NULL,4,NULL,1); } 打印结果如下:代码目的是taskA执行过程中,num值是连续增加的,然而打印中会发现,taskA打印并不连续,会被taskB抢占。 使用mutex函数 /** * Copyright (C) 2024-2034 HalfMoon2. * All rights reserved. * * @file Filename without the absolute path * @brief Brief description * @author HalfMoon2 * @date 2025-05-07 * @version v0.1 * * @revision history: * 2025-05-07 - Initial version. */ #include stdio.h #include freertos/FreeRTOS.h #include freertos/task.h #include freertos/semphr.h #include esp_log.h SemaphoreHandle_t xSemaphore; BaseType_t num=0; void taskA(void* pvPram) { while(1){ /*如果在1S获取到互斥量,那么执行num++五次并打印 */ if(xSemaphoreTake(xSemaphore,pdMS_TO_TICKS(1000))==pdTRUE){ for(int i=0;i5;i++){ num++; ESP_LOGI("taskA","num is %d",num); } xSemaphoreGive(xSemaphore); } vTaskDelay(pdMS_TO_TICKS(1000)); } } void taskB(void* pvPram) { while(1){ if(xSemaphoreTake(xSemaphore,pdMS_TO_TICKS(1000))==pdTRUE){ num++; ESP_LOGI("taskB","num is %d",num); xSemaphoreGive(xSemaphore); } vTaskDelay(pdMS_TO_TICKS(1000)); } } void app_main(void) { xSemaphore=xSemaphoreCreateMutex(); /*为了产生竞争,两个任务优先级设置一样 */ xTaskCreatePinnedToCore(taskA,"taskA",2048,NULL,4,NULL,1); xTaskCreatePinnedToCore(taskB,"taskB",2048,NULL,4,NULL,1); } 打印结果: 分析: 从打印看,当任务A执行完五次num++后,才会轮到任务B执行一次。完全符合执行逻辑。 递归锁 递归锁的引出 假设有两个互斥量M1、M2,taskA获取了M1,taskB获取了M2。然而taskA需要再获取M2才能执行下一步,且taskB也需要再获取M1才能执行下一步。这样就导致了taskA、taskB都无法释放互斥量。导致了死锁。 再假设有一个互斥量M1,任务A获取了M1后,执行一个函数,然而此函数中也获取了M1,此时任务A还没释放M1,这将导致任务A自己把自己锁了。 然而递归锁,可以多次获取,可以解决以上问题 递归锁的函数 /*创建递归锁*/ SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void ); /*获得 */ BaseType_t xSemaphoreTakeRecursive( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait); /*释放 */ BaseType_t xSemaphoreGiveRecursive( SemaphoreHandle_t xSemaphore ); 递归锁举例 死锁举例 SemaphoreHandle_t xSemaphore; BaseType_t num=0; void func(BaseType_t *a) { //获取互斥量等待时间设置为portMAX_DELAY,因为taskA为释放互斥量,导致此处一直等待 if(xSemaphoreTakeRecursive(xSemaphore,portMAX_DELAY)==pdTRUE){ *a=*a+1; xSemaphoreGiveRecursive(xSemaphore); } } void taskA(void* pvPram) { while(1){ /*如果在1S获取到互斥量,那么执行num++五次并打印 */ if(xSemaphoreTake(xSemaphore,pdMS_TO_TICKS(1000))==pdTRUE){ func(num); ESP_LOGI("taskA","num is %d",num); xSemaphoreGive(xSemaphore); } vTaskDelay(pdMS_TO_TICKS(1000)); } } void app_main(void) { xSemaphore=xSemaphoreCreateMutex(); /*为了产生竞争,两个任务优先级设置一样 */ xTaskCreatePinnedToCore(taskA,"taskA",2048,NULL,4,NULL,1); } 打印如下:程序将一直锁着,无法执行 使用递归锁 SemaphoreHandle_t xSemaphore; BaseType_t num=0; void func(BaseType_t *a) { //获取互斥量等待时间设置为portMAX_DELAY,因为taskA为释放互斥量,导致此处一直等待 if(xSemaphoreTakeRecursive(xSemaphore,portMAX_DELAY)==pdTRUE){ *a=*a+1; xSemaphoreGiveRecursive(xSemaphore); } } void taskA(void* pvPram) { while(1){ /*如果在1S获取到互斥量,那么执行num++五次并打印 */ if(xSemaphoreTakeRecursive(xSemaphore,pdMS_TO_TICKS(1000))==pdTRUE){ func(num); ESP_LOGI("taskA","num is %d",num); xSemaphoreGiveRecursive(xSemaphore); } vTaskDelay(pdMS_TO_TICKS(1000)); } } void app_main(void) { xSemaphore=xSemaphoreCreateRecursiveMutex(); /*为了产生竞争,两个任务优先级设置一样 */ xTaskCreatePinnedToCore(taskA,"taskA",2048,NULL,4,NULL,1); } 打印如下:发现完全可以正常打印了 总结 为了避免死锁,在中断中不要使用互斥量 如果有嵌套使用互斥量,请使用递归锁,递归的层数由queueQUEUE_TYPE_RECURSIVE_MUTEX决定 虽然freeRTOS没有实现谁锁谁开,但是开发过程中还是默认这么操作了
  • 2025-5-18 20:48
    189 次阅读|
    0 个评论
    6. ESP32开发之freeRTOS的信号量
    什么是信号量 信号量能干啥 信号量的函数 实例举例 总结 什么是信号量 简而言之,就是发出通知,接收通知的任务获得通知后去干啥啥。通知有多有少。自定义通知数量的,叫计数型信号量;只有有无(即“0”,“1”)通知的,叫二进制信号量。 信号量能干啥 资源管理:控制多个任务对共享资源(如外设、内存块)的访问权限,避免竞争条件 任务同步 :实现任务间的时序协调(如等待某个事件完成) 中断与任务通信:在中断服务程序(ISR)中快速通知任务处理事件(需使用 xxxFromISR 版本的函数) 信号量的函数 创建二进制信号量函数原型 SemaphoreHandle_t xSemaphoreCreateBinary()//返回值为SemaphoreHandle_t结构体指针,即创建的信号量,不成功返回NULL 释放信号量,使信号量计数加1 xSemaphoreGive(xSemaphore) 获取信号量,使信号量计数减1 xSemaphoreTake(xSemaphore, //创建的信号量 xBlockTime //等待时间,超时则返回pdFulse ); 创建计数型信号量 SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, //最大计数值 UBaseType_t uxInitialCount//初始计数值 );//返回值为SemaphoreHandle_t结构体指针,即创建的信号量,不成功返回NULL 删除信号量 void vSemaphoreDelete( SemaphoreHandle_t xSemaphore ); 实例 二进制信号量的使用 /** * Copyright (C) 2024-2034 HalfMoon2. * All rights reserved. * * @file Filename without the absolute path * @brief Brief description * @author HalfMoon2 * @date 2025-04-29 * @version v0.1 * * @revision history: * 2025-04-29 - Initial version. */ #include stdio.h #include freertos/FreeRTOS.h #include freertos/task.h #include freertos/semphr.h #include esp_log.h SemaphoreHandle_t semap=NULL; void taskA(void *pvParam) { while(1){ xSemaphoreGive(semap); vTaskDelay(pdMS_TO_TICKS(1000)); } } void taskB(void *pvParam) { BaseType_t num=0; while(1){ if(xSemaphoreTake(semap,pdMS_TO_TICKS(500))==pdPASS){ num++; ESP_LOGI("taskB","num is %d",num); }else{ ESP_LOGI("taskB","Take failed"); } } } void app_main(void) { semap=xSemaphoreCreateBinary(); xTaskCreatePinnedToCore(taskA,"taskA",2048,NULL,4,NULL,1); xTaskCreatePinnedToCore(taskB,"taskB",2048,NULL,3,NULL,1); } 结果解析:taskB任务每500ms获取一次信号量,当获取成功则num变量加一,然而taskA任务每1000ms发出一个信号量,所以taskB每间隔500ms会失败一次。 计数型信号量使用 /** * Copyright (C) 2024-2034 HalfMoon2. * All rights reserved. * * @file Filename without the absolute path * @brief Brief description * @author HalfMoon2 * @date 2025-04-30 * @version v0.1 * * @revision history: * 2025-04-30 - Initial version. */ #include stdio.h #include stdio.h #include freertos/FreeRTOS.h #include freertos/task.h #include freertos/semphr.h #include esp_log.h SemaphoreHandle_t semap=NULL; void taskA(void *pvParam) { while(1){ xSemaphoreGive(semap); vTaskDelay(pdMS_TO_TICKS(1000)); } } void taskB(void *pvParam) { BaseType_t num=0; while(1){ if(xSemaphoreTake(semap,pdMS_TO_TICKS(400))==pdPASS){ num++; ESP_LOGI("taskB","num is %d",num); }else{ ESP_LOGI("taskB","Take failed"); } } } void app_main(void) { semap=xSemaphoreCreateCounting(3,2); xTaskCreatePinnedToCore(taskA,"taskA",2048,NULL,4,NULL,1); xTaskCreatePinnedToCore(taskB,"taskB",2048,NULL,3,NULL,1); } 结果解析:创建计数型信号量时,初始值为2,taskA优先级高些先执行,信号量计数值加1,信号量计数值为3,taskB每400ms获取信号量前三次时成功的,第四次时,由于taskA阻塞时间为1000ms,这个时候其还没发出信号量,信号量计数值为0,所以taskB获取失败。 总结 二进制信号量可以说是计数型信号量的特殊用法。 信号量相对于消息队列要简单很多,区分好应用场景。信号量只传通知,消息队列是要传整个消息结构体的。如果看源码的话,信号量的API背后用的也是队列的API。 二进制信号量对后面学习互斥量给予了启发,一个任务如果take了此信号量不give,另一个任务想take会是什么结果呢?
  • 热度 2
    2025-4-17 16:27
    391 次阅读|
    2 个评论
    【原创奖励】ESP开发之ubuntu环境搭建
    1. 在Ubuntu官网下载Ubuntu server 20.04版本 https://releases.ubuntu.com/20.04.6/ 2. 在vmware下安装Ubuntu 3. 改Ubuntu静态IP $ sudo vi /etc/netplan/00-installer-config.yaml # This is the network config written by 'subiquity' network: renderer: networkd ethernets: ens33: #dhcp4: true addresses: - 192.168.4.251/24 nameservers: addresses: routes: - to: default via: 192.168.4.1 version: 2 $ sudo netplan apply $ ip addr show ens33 $ ip route show $ reboot 4. 使用SecureCRT使用SSH远程连接虚拟机的ubuntu 5. 安装各种必要的工具 sudo apt-get install git wget flex bison gperf python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0 net-tools 6. 新建esp32目录并进入 $ mkdir esp32 $ cd esp32 7. 拉取gitee工具(原因是从官方下载大概率会失败) $ git clone https://gitee.com/EspressifSystems/esp-gitee-tools.git 8. 执行gitee工具切换镜像脚本 $ cd esp-gitee-tools $ ./jihu-mirror.sh set 9. 拉取esp-idf源码 $ cd .. $ git clone --recursive https://github.com/espressif/esp-idf.git 10. 切换esp-idf版本分支到v5.3 $ cd esp-idf $ git checkout v5.3 $ git submodule update --init --recursive 如果提示失败或有错误试下这句:../esp-gitee-tools/submodule-update.sh 11. 更换pip源 $ pip config set global.index-url http://mirrors.aliyun.com/pypi/simple $ pip config set global.trusted-host mirrors.aliyun.com 12. 安装编译工具 $ ../esp-gitee-tools/install.sh 13. 设置环境变量并将环境变量放到.bashrc中(这样下次启动后上一步设置的环境变量会重新加载) $ source export.sh $ echo "source ~/esp32/esp-idf/export.sh" ~/.bashrc 14. 设置USB串口权限(解决下载代码时报USB串口权限问题) $ sudo usermod -aG dialout usrname usrname需要换成你的用户名 15. 重启 16. windows安装VSCODE,并安装如下插件 17. 通过以上插件远程连接ubuntu 这样就可以建立远程连接了,代码就可以在vscode进行查看和更改,但是我们会发现每次都需要输入密码,我们通过如下方式解决 解决使用VsCode远程ssh连接虚拟机ubuntu需要重复输入密码 18. VSCode中为远程主机安装插件 19. 按照上图依次安装如下插件 20. 进行插件配置 c/c++插件 改ESP-IDF配置 键盘同时按下ctl+shift+p,在弹出的对话框输入如下,这样我们就可以任意查看和跳转代码位置了。 21. 建立第一个工程 使用vscode远程连接虚拟机,在终端窗口进行操作 创建存放工程的目录并进入目录 mkdir esp32-prj cd esp32-prj 使用命令创建工程 idf.py create-project helloworld 进入目录更改目标芯片,一般默认为esp32 idf.py set-target esp32-s3 进行第一次编译 idf.py build 打开工程 如图操作,这样才可以方便的跳转和查看代码,每个新的工程都需要执行一次 编译代码 烧录,先连接开发板,并保证开发板是连接到了虚拟机 idf.py flash 监视开发板执行情况 idf.py monitor 退出监控使用CTL+]组合键 烧录指令可以和监控指令可以放在一起执行 idf.py flash monitor
  • 热度 4
    2025-1-25 22:09
    3393 次阅读|
    0 个评论
    【电子DIY】智能天气监控站
    项目展示 ①正面、反面 ②左侧、右侧 项目源码 : https://mbb.eet-china.com/download/316656.html 前言 为什么想到要做这个小玩意呢,作为一个死宅,懒得看手机,但又想要抬头就能看见时间和天气信息,于是就做个这么个小东西,放在示波器上面正好(示波器外壳有个小槽,刚好可以卡住) 功能主要有,获取国家气象局的天气信息,还有实时的温湿度,主控采用ESP32,所以后续还可以开放更多奇奇怪怪的功能,比如油价信息、股票信息之类的,反正能联网可操作性就大多了 原理图、PCB、面板设计均使用嘉立创EDA,项目代码方面采用Arduino IDE,项目全开源,商用请联系 设计思路 硬件信息 ①主控:ESP32(esp32 wroom 32) ②屏幕:主屏1.8寸TFT_LED,副屏0.96寸OLED ③充电:IP5306 ④降压:AMS1117-3.3 ⑤通信:CH340K ⑥接口:TYPE-C-16P ⑦传感:DHT11 ⑧电池:2000毫安锂电 原理图 PCB 面板设计 我还是第一次用到嘉立创的面板设计,这里就给大家提供一个参考,大家感兴趣也可以试一下 我设计的尺寸大概是45*60mm,最少5张起,一张5块钱,不包邮(无法使用包邮卷,8元运费) 新人领了一张10元优惠券,所以最终是23块钱 不知道这个价格怎么样? 要补充一点,嘉立创面板的服务还是很到位的,可能他们怕你不会弄,会有专员加你确认生产稿,这点还是非常好评的 我第一次画就画错了,在确认生产稿环节,才将图纸改正确,不然血亏23块钱 我采用的方法是,拼了几张图片,中间不设图案,透明显示(屏幕显示) 不知道正确的方法是不是这样,反正效果也还可以 目前功能 ①温度、湿度检测 ②户外天气获取 ③自动配网 ④主屏、副屏显示 ⑤智能充放电 ⑥天气图片适配 ⑦天气文字适配 ⑧OLED支持常用中文库 ⑨NTP网络时钟 温湿度检测 使用DHT11传感器,库文件dht11库,库文件地址https://wwmg.lanzouu.com/id6GV2fydzpa 非常常用的库,使用方法也很简单,DHT11.read更新传感器信息,然后直接用DHT.humidi和DHT11.temperature读取温湿度信息 户外天气获取 通过获取天气API,然后使用JSON库解析API信息 天气API地址:http://api.xemowo.top/api/tqyb.html 调用ParseWeather函数(连接网络后),访问API,并且解析JSON信息,将数据保存至变量 自动配网 在setup函数中,就调用connectToWiFi函数,带入数据为超时时长,在15s内读取内存保存的网络数据,并且进行连接,连接失败或超时,则进行配网 进入配网状态,手机、电脑在wifi列表可见XEM_ESP32,进行连接,连接成功会自动跳转到配网界面 输入WIFI账号密码后,会将数据保存进内存,方便下次启动连接WIFI NTP时钟 采用NTPClient库,使用阿里云NTP授时 库函数:https://github.com/arduino-libraries/NTPClient 天气图片适配 工程文件夹中,BMP.H文件保存大部分常用天气的图标,以及一些用得到的图标,代码会根据当前天气,自动适配图片 天气文字适配 XEM_FONT.H文件中,则保存所需天气的中文字符 参考库大全 WiFi.h 内置 ArduinoJson.h https://github.com/bblanchon/ArduinoJson HTTPClient.h 内置 Arduino.h 内置 TFT_eSPI.h https://github.com/Bodmer/TFT_eSPI SPI.h 内置 string.h 内置(C/C++ 标准库) NTPClient.h https://github.com/arduino-libraries/NTPClient WiFiUdp.h 内置 U8g2lib.h https://github.com/olikraus/u8g2 Wire.h 内置 dht11.h https://github.com/adafruit/DHT-sensor-library 复刻成本 批发会更便宜,以下价格为单买 (一)元器件 1.8寸TFT_LEC:11元 0.96寸OLED:8元 ESP32:13元 DHT11:4元 CH340K:3元 IP5306:2元 AMS1117:1元 2000锂电池:3元 其他元器件:5元 (二)其他 PCB:白嫖 面板:23元 螺丝:2元 汇总:75元 总结 项目初代可能功能比较单一,但是ESP32的能力还远不止这么点,后续还可以更新APP,以及其他接口功能 后续可能考虑用3D打印替换面板,因为面板还是比较贵,而且不是封闭的 元器件可以批发买,外壳采用3D打印,成本可能可以降到50内 后代可能会考虑去掉OLED屏幕,以及将DHT11换成更小的传感芯片,可以将体积缩小一半,这样更加的迷你和轻便 大家有什么意见可以讨论一下,复刻有问题的,可以联系我
  • 热度 4
    2024-10-28 08:20
    2019 次阅读|
    0 个评论
    前言 (一)在当今这个瞬息万变的数字化时代,导航技术已经深入到我们生活的方方面面,从日常出行到物流配送,再到应急救援,无不彰显其重要性。 随着智能手机和物联网技术的飞速发展,对于导航系统的需求不再仅仅局限于简单的路线指引,而是更加追求精准性、实时性和智能化。在此背景下,将高德导航的路径规划算法高效应用于单片机系统及移动APP中,不仅是对传统导航技术的一次革新,更是推动智慧城市、智能交通系统建设的关键一环。 (二)单片机,作为嵌入式系统的核心,凭借其体积小、功耗低、集成度高等特点,在车载设备、智能家居、工业自动化等领域发挥着不可替代的作用。 将高德导航的路径规划功能集成到单片机上,意味着可以实现更为紧凑、低功耗的导航解决方案,为车辆自主导航、无人机路径规划等应用场景提供强有力的技术支持。这不仅要求算法在保持高精度的同时,还需进行深度优化以适应单片机有限的计算资源和存储能力。 (三)所以本文将给大家分享一下,我将高德开放平台的导航、路径规划功能运用到单片机及APP上,从而可以快速开发导航类、规划类的项目。当然方法有非常多种,我本次分享的仅仅是高德的冰山一角,高德提供的API,甚至可以让单片机不需要APP支持,独立运行导航、路径规划等项目 本文末尾,有项目所有代码的下载地址 效果展示 (一)APP展示 由于是快速开发,所以没有任何美化,仅是实现功能。APP开发平台:App Inventor 图:设定目的地后,会自动规划最近的路线,然后实时定位导航 (二)单片机展示 单片机:ESP32 图:APP开始导航后,将导航信息发送到ESP32 项目大纲 APP设定目的地→→地理编码API→→APP定位经纬度→→坐标转换API→→路径规划API→→APP显示静态图→→提交单片机显示 为了不泄露信息,最好对高德API进行封装,然后通过自己的API来操作。同时APP和单片机的通信也用到API。http://api.xemowo.top (一)获取高德开放平台API ①路径规划API:https://lbs.amap.com/api/webservice/guide/api/direction 对步行、公交路径规划,返回从原地到目的地的信息(方向,距离,时间,步行指示等) ②地理编码API:https://lbs.amap.com/api/webservice/guide/api/georegeo 将地址信息,转化为经纬度等信息。如:中山市港口镇政府,返回信息:"location" :"113.384324,22.584733" ③坐标转换API:https://lbs.amap.com/api/webservice/guide/api/convert 将用户输入的非高德坐标(GPS坐标、mapbar坐标、baidu坐标)转换成高德坐标。 ④静态地图:https://lbs.amap.com/api/webservice/guide/api/staticmaps 项目可以不用静态地图,因为路径规划API也会返回带有标记的静态图 (二)封装API(因人而异,后面我会放出PHP源码) ①地址查询经纬度:http://api.xemowo.top/api/gaode/chaxun.php 文档:http://api.xemowo.top/api/chaxun.html ②坐标转换:http://api.xemowo.top/api/gaode/gps.php 文档:http://api.xemowo.top/api/GPS.html ③路径规划:http://api.xemowo.top/api/gaode/walk.php 文档:http://api.xemowo.top/api/walk.html ④单片机接收信息:http://api.xemowo.top/api/gaode/esp_walk.php 文档:http://api.xemowo.top/api/esp_walk.html (三)制作APP App Inventor,Android编程工具https://www.17coding.net/ 采用图形化积木式的拖放组件,完全在线开发的Android编程环境,无需复杂的软件安装,可以通过浏览器直接访问并进行编程。 (四)单片机编程 Arduino IDE,内置很多库函数,对编程极其方便,速成项目,并且资料很多,对初学者帮助非常大 高德API (一)注册高德开放平台的账号https://lbs.amap.com/ (二)应用管理----创建新应用 (三)添加key,选择web服务(请勿泄露key) (四)寻找所需的API,本期项目我们需要4个高德API 注意个人用户调用的限量,企业用户会多一些,超过限量可能被禁止使用 ①路径规划API:https://lbs.amap.com/api/webservice/guide/api/direction 对步行、公交路径规划,返回从原地到目的地的信息(方向,距离,时间,步行指示等) ②地理编码API:https://lbs.amap.com/api/webservice/guide/api/georegeo 将地址信息,转化为经纬度等信息。如:中山市港口镇政府,返回信息:"location" :"113.384324,22.584733" ③坐标转换API:https://lbs.amap.com/api/webservice/guide/api/convert 将用户输入的非高德坐标(GPS坐标、mapbar坐标、baidu坐标)转换成高德坐标。 ④静态地图:https://lbs.amap.com/api/webservice/guide/api/staticmaps 项目可以不用静态地图,因为路径规划API也会返回带有标记的静态图 制作API 搭建API(网站)需要一台服务器,并且需要开发环境 我这里的环境如下: 系统:Orange Pi 1.0.2 Jammy (aarch64) WEB平台:OpenResty PHP:PHP-72 域名:API.XEMOWO.TOP (一)坐标转换API (http://api.xemowo.top/api/GPS.html) 示例:http://api.xemowo.top/api/gaode/gps.php?gps=113.38472,22.59476&photo=0
相关资源