• ¼¼Êõ²©¿Í

    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±¨ÎÄ´«µÝµ½À©Õ¹×é¼þÖУ¬Èç¸ú×Ù´°¿Ú»ò¿ÉÊÓÒDZí¡£

    ͼ±ê

    ¸ÃÄ£¿é°üº¬¿ÉÓÃÓÚ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¡¿