¼¼Êõ²©¿Í

27/03/2025 ×÷Õß ÔÆº£ÓÎÏ·

¹ØÓÚCanKing 7 GUIÀ©Õ¹£º´´½¨ÓëʹÓÃÖ¸ÄÏ

ʲôÊÇCanKing 7 GUIÀ©Õ¹£¿

CanKing 7 GUIÀ©Õ¹ÊÇ ÔÆº£ÓÎÏ· CanKingÖеÄͼÐÎÊÓͼ¡£ÕâЩÊÓͼÔÊÐíÈκÎÈËʹÓÃÆä»ùÓÚWebµÄ×é¼þÀ©Õ¹Óû§½çÃæ¡£Óû§¿ÉÒÔͨ¹ý´´½¨°´Å¥À´·¢Ëͱ¨ÎÄ£¬Ò²¿ÉÒÔͨ¹ý´´½¨¸÷ÖÖÍø¸ñºÍÒDZíÀ´ÏÔʾ´ÓCAN×ÜÏß½ÓÊÕµ½µÄÐÅÏ¢¡£

ÈçºÎ´´½¨À©Õ¹

ÔÚCanKingÖпª·¢Í¼ÐÎÓû§½çÃæ£¨GUI£©À©Õ¹ËùʹÓõļ¼ÊõÊÇReact¡£ReactÊÇÓÃÓÚ¹¹½¨Óû§½çÃæµÄJavaScript¿â¡£Í¨¹ýʹÓÃÍøÂç¼¼Êõ£¬CanKing¿ÉÒÔÈ·±£ËٶȺͰ²È«ÐÔ£¬¶ø»ùÓÚÍøÂçµÄÓ¦ÓóÌÐò£¨°üÀ¨ÓÎÏ·£©¶¼ÓÐÕâÁ½¸öÒªÇó¡£

CanKing APIºÍReact

Îĵµ

CanKing GUIÀ©Õ¹API¶¨ÒåÁËÔÆº£ÓÎÏ·ÌØ¶¨×é¼þ¡£À©Õ¹³ÌÐò¿ÉÒÔʹÓÃÕâЩ×é¼þ·¢ËͺͽÓÊÕCAN±¨ÎÄ£¬²¢ÊµÏÖÓëCanKing UIºÍ·þÎñµÄ½»»¥¡£

ÆäËû¶¨ÒåºÍ¸ÅÄÈç¹³×Ó£©À´×ÔReact±¾Éí¡£¶ÔÓÚѧϰReact£¬https://react.dev/learnÊÇÒ»¸öºÜºÃµÄÆðµã¡£

ÔÚÔĶÁAPIÎĵµºÍʵʩÀ©Õ¹Ê±£¬Á˽âÕâЩ¸ÅÄî·Ç³£ÖØÒª¡£

´ò¿ªWebä¯ÀÀÆ÷´°¿Úºó£¬Äú¿ÉÒÔÔÚÆäÖÐä¯ÀÀAPI¡£

¿ÉÓÃÄ£¿é

API±»»®·ÖΪ²»Í¬µÄÄ£¿é¡£Ä¿Ç°£¬ÕâЩÄ£¿é°üÀ¨¿Ø¼þ¡¢¹³×Ó¡¢Í¼±ê¡¢IPCºÍÄ£ÐÍ¡£

¿Ø¼þ

ÕâЩÊÇ×÷ΪReact×é¼þʵÏÖµÄUI¿ØÖÆ×é¼þµÄº¯Êý¡¢ÀàÐͺͽӿÚ¡£ÀýÈçCanIdentifierControl£¬Ëü´´½¨ÁËÒ»¸öÓÃÓڱ༭CAN±êʶ·ûµÄUI¿Ø¼þ¡£

¹³×Ó

¸ÃÄ£¿é¶¨ÒåÁËReact¹³×Ó¡£ÕâЩ¶¼ÊÇÒÔ¡°use¡±¿ªÍ·µÄº¯Êý£¨Çë²ÎÔÄÏÂÎĽ¨Ò飩£¬¿ÉÒÔÔÚʼþ·¢ÉúʱΪ×é¼þÌṩ»Øµ÷£¬Ò²¿ÉÒÔÌṩÓÃÓÚ¸üÐÂÊý¾ÝµÄº¯Êý¡£

useProjectDataÊÇÒ»¸öÖØÒªµÄ¹³×Ó £¬ËüÔÊÐíÀ©Õ¹³ÌÐòÔÚCanKingÏîÄ¿£¨*.ckproj£©ÎļþÖд洢ºÍ¼ÓÔØÆäÉèÖá£

ÁíÒ»¸ö¹³×ÓÊÇuseNewMeasurementData£¬Ëü¿ÉÒÔ½«CAN±¨ÎÄ´«µÝµ½À©Õ¹×é¼þÖУ¬Èç¸ú×Ù´°¿Ú»ò¿ÉÊÓÒÇ±í¡£

ͼ±ê

¸ÃÄ£¿é°üº¬¿ÉÓÃÓÚCanKing UIµÄͼ±ê¡£

IPC

¸ÃÄ£¿éʵÏÖÁËÓëCanKing·þÎñ½»»¥µÄ½ø³Ì¼äͨÐÅ£¨IPC£©¡£ÀýÈ磺

- sendCanMessage(  
        channelId: string,  
        canId: number,  
        data: number[],  
        ...flags: [CanFrameFlag](../enums/models.CanFrameFlag.html)[],  
    ): Promise<void>

ÁíÒ»¸öº¯ÊýÊÇupdateSource£¬ËüÔÊÐíÀ©Õ¹³ÌÐò¸üÐÂCANͨµÀµÄÊôÐÔ£¬Èç×ÜÏß²ÎÊý¡£Çë×¢Ò⣬ÐèҪʹÓù³×ÓuseMeasurementSetupÀ´¸üе±Ç°µÄ×ÜÏß²ÎÊý¡£

Ä£ÐÍ

Ä£ÐÍÄ£¿é°üº¬ÀàÐÍ¡¢Àà¡¢½Ó¿Ú¡¢Ã¶¾ÙµÈ¡£ÆäÖÐÒ»¸öµäÐ͵ÄÀý×Ó¾ÍÊÇuseNewMeasurementDataÖеĿò¼Ü¡£

´´½¨À©Õ¹

°²×°¹¤¾ß

ΪÁË¿ªÊ¼Ê¹Óã¬ÄúÐèÒªCanKing 7ºÍÇý¶¯³ÌÐò¡£Äú»¹ÐèÒªNodeJSºÍ±à¼­Æ÷¡£Ôƺ£ÓÎÏ· CanKing GUI Extensions SDKÖеÄ˵Ã÷½âÊÍÁËϸ½Ú¡£¼ò¶øÑÔÖ®£¬ÄúÐèÒª£º

  1. ÔÆº£ÓÎÏ·Çý¶¯³ÌÐò
  2. CanKing 7
  3. NodeJS
  4. Visual Studio´úÂë

ʹÓÃNpm´´½¨ÐÂÀ©Õ¹

  • È·±£ÒѰ²×°NojeJS²¢½«Æä·ÅÔÚÃüÁîÐеÄPATHÖС£
  • ʹÓÃnpmÃüÁîÐд´½¨À©Õ¹£ºnpm create @kvaser/canking-extension@latest

£¨°´»Ø³µ¼ü½øÐÐĬÈÏÑ¡Ôñ£©

C:\Users\mabu\OneDrive - ÔÆº£ÓÎÏ· AB\proj\CanKing-7-GUI-Extension-Guide>npm create @kvaser/canking-extension@latest

> npx
> create-extension

√ Project name: ... my-ck-extension
√ Package name: ... my-ck-extension
√ Display name: ... MyCkExtension
√ Package description: ... A CanKing GUI extension
√ Package author: ... ÔÆº£ÓÎÏ· FAE

Creating a new CanKing extension in C:\Users\mabu\OneDrive - ÔÆº£ÓÎÏ· AB\proj\CanKing-7-GUI-Extension-Guide\my-ck-extensi
on.


A project for extension my-ck-extension has been created successfully.

npmÏÖÔÚÒѾ­´´½¨ÁËÒ»¸öÃûΪmy-ck-extension£¨Ñ¡¶¨µÄÏîÄ¿Ãû³Æ£©µÄĿ¼½á¹¹¡£ÎÒÃǽøÈë¸ÃĿ¼¡£

cd my-ck-extension

ʹÓð汾¿Ø¼þ

ÔÚ¸ÃĿ¼ÖУ¬ÒѾ­´´½¨ÁËÐí¶àÎļþ¡£ÎªÁ˸ú×Ù¸ü¸Ä£¬ÈÃÎÒÃÇʹÓÃgit½«ËüÃÇÌí¼Óµ½Ô´´úÂë¿Ø¼þÖС£

git init
git add .
git commit -m "Create CanKing7 extension from template"

°²×°ÒÀÀµÏî

ÓÉÓÚÎÒÃǵÄÀ©Õ¹Ê¹ÓÃÁËNodeJS£¬Òò´ËÐèÒª°²×°À©Õ¹Ê¹ÓõÄÈí¼þ°ü¡£ÔÚmy-ck-extensionĿ¼ÖУ¬Ê¹Óãº

npm install

Õ⽫ÔÚÃûΪnode_modulesµÄÐÂĿ¼Öа²×°ËùÓбØÒªµÄÈí¼þ°ü¡£

ÔËÐÐÀ©Õ¹

¼ÓÔØ´úÂë

´ÓÀ©Õ¹Îļþ¼ÐÖÐʹÓÃshellÃüÁîÆô¶¯VS Code£º

  code .

Æô¶¯/µ÷ÊÔÀ©Õ¹

  • Èç¹ûÒѾ­°²×°ÁËÀ©Õ¹£¬¿ÉÒÔ´ÓVisual Studio Code¿ªÊ¼µ÷ÊÔ£º
  • Ò²¿ÉÒÔʹÓÃÖÕ¶Ë£º
npm run start

ÔÚCanKingÖÐÌí¼ÓÀ©Õ¹

ÉÔµÈÆ¬¿Ìºó£¬CanKing 7½«Æô¶¯£¬ÐÂÀ©Õ¹½«³öÏÖÔÚ¹¤×÷ÇøµÄ¡°Ñ¡ÔñÊÓͼ¡±²Ëµ¥ÖУº

ÔÚ¹¤×÷ÇøÖУ¬»á³öÏÖÒ»¸öÏÔʾÀ©Õ¹µÄÐÂÊÓͼ£º

¼ì²éÔ´

React

CanKing 7ʹÓÃTypeScript£¬ÕâÊÇJavascriptµÄ¾²Ì¬ÀàÐͳ¬¼¯£¬Ôö¼ÓÁËÀàÐͶ¨Òå¡£

Çë×¢Ò⣬ÓÉÓÚReact½Ì³Ì¿ÉÒÔʹÓÃJavaScript»òTypeScript£¬Òò´ËÇëÈ·±£Ê¹ÓÃÐèҪ˵Ã÷±äÁ¿ÀàÐ͵ÄTypeScript°æ±¾¡£

  • https://react.dev/learn
  • https://react.dev/learn/typescript

Javascript¡¢TypescriptºÍXML

ΪÁ˲鿴À©Õ¹£¬ÎÒÃǽ«¿ªÊ¼¼ì²éÎļþsrc / WorkspaceView / index.tsx

my-ck-extension
©¸©¤©¤©¤src
    ©¸©¤©¤©¤WorkspaceView
        ©¸©¤©¤©¤index.tsx

Õâ¸öÎļþµÄÀ©Õ¹ÃûÊÇ¡°.tsx¡±£¬ÎÒÃÇÓɴ˵óö£º

  • t±íʾÕâÊÇTypeScript£¬JavascriptµÄ¾²Ì¬ÀàÐͳ¬¼¯£¬Ôö¼ÓÁËÀàÐͶ¨Òå¡£
  • x±íʾÕâÊÇJavaScriptµÄÀàËÆXMLµÄÓï·¨À©Õ¹¡£

ÓÐÁËÀàÐͶ¨Ò壬¾ÍÄܼ°Ôç·ÀÖ¹´íÎ󣬲¢ÔÊÐí´úÂë±à¼­Æ÷²éÕÒÊý¾Ý½á¹¹¡£ÀýÈ磬½Ó¿ÚIProjectData¶¨ÒåÁËÎÒÃÇÀ©Õ¹ÖеÄÄÄЩÊý¾Ý»á±£´æÔÚCanKing 7ÏîÄ¿ÎļþÖС£ÎÒÃÇÔÚ´Ë˵Ã÷£¬²ÎÊýchannelId±ØÐëÊÇ×Ö·û´®ÀàÐÍ¡£

// If any data should be stored in the project file then add it to this interface
interface IProjectData {
  // This is an example showing how to store the selected channel id to the project file
  channelId: string;
}

WorkspaceViewº¯Êý

ÎÒÃǵÄIndex.tsxͨ¹ý¶¨ÒåÃûΪWorkspaceViewµÄº¯ÊýʵÏÖÁËCanKing 7µÄÀ©Õ¹¡£¸Ãº¯ÊýÊ×ÏÈÒÔ±ê×¼·½Ê½¶¨Òå±äÁ¿£º

function WorkspaceView() {
  // Get this view's unique id from search params
  const [searchParams] = useSearchParams();
  const idString = searchParams.get('id');

ÔÚº¯Êý½áÊøÊ±£¬ÎÒÃÇ·µ»Ø¶¨ÒåReact×é¼þµÄÊý¾Ý½á¹¹¡£Í¨¹ýÓï·¨À©Õ¹£¬ÎÒÃÇ¿ÉÒÔÖ±½Ó±àдXML½á¹¹¡£

´óÀ¨ºÅ£¨Èç{icon}ÖеĴóÀ¨ºÅ£©ÔÊÐíÎÒÃÇÔÚÆäÖÐǶÈëʹÓñäÁ¿µÄ±í´ïʽ¡£ÎÒÃÇÕýÔÚʹÓÃÎļþ¶¥²¿µÄͼ±ê£º

import icon from '../assets/icon.png';

ÎÒÃÇ¿ÉÒÔ¿´µ½£¬À©Õ¹°üº¬Ò»¸öλÓÚ¶¥²ãµÄ·½¿ò×é¼þ£º

    return (
        <Box aria-label="canking-extension-view" margin={1}>
            <h3>Add your elements here!</h3>
            <div>This is an example how to embed an image:</div>
            <img src={icon} height={50} />

·¢ËÍCAN±¨ÎÄ

Òª·¢ËÍÏûÏ¢£¬Ê×ÏÈÐèÒªµ¼ÈëÒ»¸ö°´Å¥¡£

import { Box, Button } from '@mui/material';

È»ºó½«ÆäÌí¼Óµ½WorkspaceViewº¯ÊýÖУ¬²¢½«ÆäonClickpropÉèÖÃΪonSendCanMessage¡£

<Button onClick={onSendCanMessage}> Send CAN Message </Button>

»Øµ÷º¯ÊýonSendCanMessageÊÇͨ¹ýReact¹³×ÓuseCallback´´½¨µÄ¡£

// A callback that will send out a CAN message on the selected channel with the specified CAN id
  const onSendCanMessage = useCallback(() => {
    if (projectData.channelId !== '') {
      const flags =
        sessionData.canIdType === 'extended' ? CanFrameFlag.CAN_FRAME_FLAG_EXT : CanFrameFlag.CAN_FRAME_FLAG_STD;
      sendCanMessage(projectData.channelId, sessionData.canId, [0x55], flags);
    }
  }, [projectData.channelId, sessionData.canId, sessionData.canIdType]);

Ô­ÒòÔÚÓÚ£¬sendCanMessageÐèÒª·ÃÎÊchannelId£¨×Ö·û´®£©£¬ÒÔ±ã֪ͨCanKing 7·þÎñÔÚÄĸöͨµÀÉÏ·¢ËÍ¡£½¨Ò齫¸Ã×Ö·û´®´æ´¢ÔÚprojectDataÖС£À©Õ¹ÖеÄËùÓÐ×é¼þ¶¼¿ÉÒÔʹÓÃÕâ¸ö×Ö·û´®£¬ÒòΪËüÊÇÔÚ¶¥²ã¶¨ÒåµÄ¡£ËüÒ²Óë.ckprojÎļþÒ»Æð±£´æºÍ¼ÓÔØ¡£

// Use the useProjectData hook to serialize/deserialize your view data to the project
const { projectData, setProjectData } = useProjectData<IProjectData>(id, defaultProjectData);

ÒªÉèÖÃchannelId£¬¿ÉÒÔÌí¼ÓCanChannelSelectControl¡£ÆäÒ²ÓÉCanKing 7 SDKÌṩ¡£ÎªÊ¹ÆäÕý³£¹¤×÷£¬¸Ã×é¼þÐèÒª£º

  1. ÔÚ´´½¨Ê±ÖªµÀÒªÏÔʾÄĸöÑ¡Ïî¡£
  2. ¸ù¾ÝÑ¡ÏîµÄ±ä»¯²ÉÈ¡Ðж¯£¬²¢½«Ñ¡Ïî´æ´¢ÔÚ×ÔÉíÖ®Íâ¡£

Ϊ´Ë£¬SDK¶¨ÒåÁ˽ӿÚCanChannelSelectControlProps£¬ÔÊÐí½«ÅäÖòÎÊý´«µÝ¸ø¿Ø¼þ¡£

£¨¸ù¾ÝReact¹ßÀý£¬½Ó¿ÚµÄÃû³ÆÊÇ×é¼þÃû³Æ + Props£©¡£

³ýÆäËû²ÎÊýÍ⣬onChannelIdentifierChangeÊôÐÔ»¹½ÓÊÜÓû§Ñ¡ÔñCANͨµÀʱ½«µ÷ÓõĻص÷º¯Êý¡£Ëü»¹¿ÉÒÔͨ¹ýchannelIdentifier»ñÈ¡³õʼֵ¡£

<CanChannelSelectControl
    channelIdentifier={projectData.channelId}
    onChannelIdentifierChange={onChannelIdentifierChange}
    hideSectionControl
  />

onChannelIdentifierChange»Øµ÷º¯Êý¶¨ÒåÈçÏ£º

  // A callback that will get the new selected channel id and save it to the project data
  const onChannelIdentifierChange = useCallback(
    (channelId: string) => {
      const data = { ...projectData };
      data.channelId = channelId;
      setProjectData(data);
    },
    [projectData, setProjectData],
  );

ÖÁ´Ë£¬¶ÔÐÂÀ©Õ¹ÌØÐԵijõ²½¼ì²é¾Í½áÊøÁË¡£

Author Image

Mattias Busck

¡¾ÍøÕ¾µØÍ¼¡¿¡¾sitemap¡¿